package main

import (
	"fmt"
	"learngo/act"
	"learngo/mock"
	"time"
)

type Retriever interface {
	Get(url string) string
}

type Post interface {
	Post(map[string]string) string
}

//组合接口
type RetrieverPost interface {
	Retriever
	Post
}

func session(s RetrieverPost) string{
	//这个不能返回，因为act.Retriever没有对应方法
	s.Post(map[string]string{
		"content": "another faked message",
	})
	//这个可以返回，因为都实现了Get方法
	return s.Get("http://www.imooc.com")
}

func main() {
	var r Retriever

	//var r Retriever
	mockRetriever := mock.Retriever{Content:"this is a fake message"}
	r = &mockRetriever
	//方法是个接口，要传入一个具体的实现类，因而需要传入一个指针，指向实现类？？
	inspect(r)

	r = &act.Retriever{UserAgent: "Mozilla/5.0",
		Timeout: time.Minute,}
	inspect(r)


	actRetriever := &act.Retriever{UserAgent: "Mozilla/5.0",
		Timeout: time.Minute,}

	fmt.Println(session(&mockRetriever)) //正确，必须是一个实现类型
	fmt.Println(session(actRetriever)) //正确，必须是一个实现类型
	//fmt.Println(session(r))  //报错，必须是一个实现类型
}

func inspect(r Retriever)  {

	fmt.Println("Inspecting",r)
	fmt.Printf("Type %T, value %v\n",r,r)
	fmt.Println(" > Type switch: ")
	switch v :=r.(type) {
	case *mock.Retriever:
		fmt.Println(v.Content)
	case  *act.Retriever:
		fmt.Println(v.UserAgent)
	}
	fmt.Println()
}
